---
title: 概述
---
## 认证和授权
### 认证
在 Spring Security 的架构设计中，认证（Authentication）和授权（Authorization）是分开的，无论使用什么样的认证方式，都不会影响授权，这是两个独立的存在，这种独立带来的好处之一，就是 Spring Security 可以非常方便地整合一些外部认证方案。

在 Spring Security 中，用户的认证信息主要由 Authentication 的实现类来保存，Authentication 的接口定义如下。

```java

/**
 * 一个表示认证主体（principal）的接口，扩展自 {@link Principal} 和 {@link Serializable}。
 * 这个接口通常用于安全框架中，代表已经经过身份验证的用户或系统组件。
 */
public interface Authentication extends Principal, Serializable {

    /**
     * 返回与此认证主体关联的权限集合。
     * 权限通常是 {@link GrantedAuthority} 的实例，表示主体被授予的操作权限。
     *
     * @return 与认证主体关联的权限集合
     */
    Collection<? extends GrantedAuthority> getAuthorities();

    /**
     * 返回用于证明认证主体身份的凭证。
     * 这可能是密码、密钥或其他类型的敏感信息。
     *
     * @return 认证主体的身份凭证
     */
    Object getCredentials();

    /**
     * 返回额外的详细信息，这些信息可能对认证过程有用。
     * 这些信息可能包括客户端会话ID、IP地址等。
     *
     * @return 额外的详细信息对象
     */
    Object getDetails();

    /**
     * 返回表示认证主体的对象。
     * 这通常是用户的用户名、电子邮件地址或其他唯一标识符。
     *
     * @return 表示认证主体的对象
     */
    Object getPrincipal();

    /**
     * 检查认证主体是否已通过身份验证。
     *
     * @return 如果认证主体已通过身份验证，则返回 true；否则返回 false
     */
    boolean isAuthenticated();

    /**
     * 设置认证状态。
     * 如果传入的参数为 false，则必须抛出 {@link IllegalArgumentException}，
     * 因为一旦设置为 false，就不能再次设置为 true。
     *
     * @param isAuthenticated 认证状态
     * @throws IllegalArgumentException 如果尝试将已通过身份验证的状态重置为未通过身份验证
     */
    void setAuthenticated(boolean isAuthenticated) throws IllegalArgumentException;
}

```


